package com.lgc.javathread.signalTest.cyclicBarrierTest;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 回环栏栅这个类，让所有的线程都去相互等待，直到它们都到达了一个栏栅的点。
 * 实现让一组线程等待至某个状态之后再全部同时执行
 * 叫做回环是因为当所有等待线程都被释放以后，CyclicBarrier可以被重用
 * <p>
 * await方法，用来挂起当前线程，直至所有线程都到达barrier状态再同时执行后续任务
 */
public class CyclicBarrierTest1 {
    public static void main(String[] args) {
        final int N = 4;
        CyclicBarrier barrier = new CyclicBarrier(N);//参数让多少个线程或者任务等待至barrier状态
        for (int i = 0; i < 9; i++) {
            new Thread(new Writer(barrier, i + 1)).start();
        }

        /*try {
            Thread.sleep(6000);
            barrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }*/
    }

}

class Writer implements Runnable {
    CyclicBarrier barrier;
    int time;

    public Writer(CyclicBarrier barrier, int time) {
        this.barrier = barrier;
        this.time = time;
    }

    @Override
    public void run() {

        String name = Thread.currentThread().getName();
        System.out.println(name + "开始读写数据");
        try {
            Thread.sleep(time * 1000);
            System.out.println(name + "结束读写数据");

            //当所有线程线程写入操作完毕之后，所有线程就继续进行后续的操作了。
            barrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        System.out.println(name + " 线程都读取完毕，开始其他的操作");

    }
}
